//********************************************************************
//	created:	13:10:2011   10:30
//	filename: 	server.h
//	author:		tiamo
//	purpose:	service
//********************************************************************

#pragma once

//
// server
//
class Server
{
public:
	//
	// constructor
	//
	Server();

	//
	// destructor
	//
	~Server();

	//
	// start
	//
	void start(int argc, char const* argv[]);

	//
	// run
	//
	void run();

	//
	// stop
	//
	void stop();

	//
	// start service
	//
	void startService(Service* theService);

	//
	// get service by name
	//
	Service* getServiceByName(wchar_t const* serviceName);

	//
	// get log manager
	//
	utils::LogManager* getLogManager()										{return &mLogManager;}

	//
	// get config
	//
	utils::Config* getConfig()												{return &mConfig;}

	//
	// get http request manager
	//
	utils::RequestManager* getHttpRequestManager()							{return &mHttpRequestManager;}

	//
	// get sql request manager
	//
	utils::RequestManager* getSQLRequestManager()							{return &mSQLRequestManager;}

	//
	// get socket manager
	//
	network::SocketManager* getSocketManager()								{return mSocketManager;}

	//
	// get timer manager
	//
	utils::TimerManager* getTimerManager()									{return &mTimerManager;}

	//
	// get singleton
	//
	static Server* getSingleton()											{return mSingleton;}

private:
	//
	// new rss item
	//
	void onNewRSSItem(rss::Service* theService, rss::RSSItemList const& addedItemList);

	//
	// build notification
	//
	void onBuildNotification(utils::BaseRequest* theRequest);

private:
	//
	// stop event
	//
	utils::Event															mStopEvent;

	//
	// config
	//
	utils::Config															mConfig;

	//
	// log manager
	//
	utils::LogManager														mLogManager;

	//
	// timer manager
	//
	utils::TimerManager														mTimerManager;

	//
	// database
	//
	mysql::Database															mDatabase;

	//
	// socket manager
	//
	network::SocketManager*													mSocketManager;

	//
	// sql request manager
	//
	utils::RequestManager													mSQLRequestManager;

	//
	// http request manager
	//
	utils::RequestManager													mHttpRequestManager;

	//
	// service list
	//
	std::vector<Service*>													mServiceList;

	//
	// singleton
	//
	static Server*															mSingleton;
};
